﻿using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// @brief 游戏状态类，处理游戏进行时的逻辑和按钮点击事件。
/// 继承自FSMState，用于实现有限状态机中的游戏状态。
/// </summary>
public class PlayState : FSMState
{
    /**
     * @brief Awake方法，在对象加载时被调用。
     * 
     * 设置状态ID为游戏状态，并添加状态转换规则。
     */
    private void Awake()
    {
        stateID = StateID.Play; ///< 设置当前状态为游戏状态。
        AddTransition(Transition.PauseButtonClick, StateID.Menu); ///< 添加状态转换规则：点击暂停按钮时，转到菜单状态。
    }

    /**
     * @brief DoBeforeEntering方法，在进入状态前执行。
     * 
     * 显示游戏界面，调整相机视角到游戏状态，并开始游戏。
     */
    public override void DoBeforeEntering()
    {
        ctrl.view.ShowGameUI(ctrl.model.Score, ctrl.model.HighScore); ///< 显示游戏界面及得分、最高得分。 
        ctrl.cameraManager.ZoomIn(); ///< 调整相机视角到游戏状态。
        ctrl.gameManager.StartGame(); ///< 开始游戏。
    }

    /**
     * @brief DoBeforeLeaving方法，在离开状态前执行。
     * 
     * 隐藏游戏界面，显示重新开始按钮，并暂停游戏。
     */
    public override void DoBeforeLeaving()
    {
        ctrl.view.HideGameUI(); ///< 隐藏游戏界面。
        ctrl.view.ShowRestartButton(); ///< 显示重新开始按钮。
        ctrl.gameManager.PauseGame(); ///< 暂停游戏。
    }

    /**
     * @brief OnPauseButtonClick方法，处理暂停按钮点击事件。
     * 
     * 播放点击音效，并执行状态转换到菜单状态。
     */
    public void OnPauseButtonClick()
    {
        ctrl.audioManager.PlayCursor(); ///< 播放点击音效。
        fsm.PerformTransition(Transition.PauseButtonClick); ///< 执行状态转换。
    }

    /**
     * @brief OnRestartButtonClick方法，处理重新开始按钮点击事件。
     * 
     * 隐藏游戏结束界面，重启游戏数据，开始游戏，并更新游戏界面。
     */
    public void OnRestartButtonClick()
    {
        ctrl.view.HideGameOverUI(); ///< 隐藏游戏结束界面。
        ctrl.model.Restart(); ///< 重启游戏数据。
        ctrl.gameManager.StartGame(); ///< 开始游戏。
        ctrl.view.UpdateGameUI(0, ctrl.model.HighScore); ///< 更新游戏界面，重置得分为0，保持最高得分不变。
    }
}